﻿using System;
using UnityEngine;
using System.Reflection;

namespace HTDW_Framework
{
    // 程序主运行类
    [RequireComponent (typeof (Camera))]
    public sealed partial class HTDW : MonoBehaviour
    {
        // ======================================== MonoBehaviour触发 ========================================
        // 当这个MonoBehaviour实例化后紧接着执行
        void Awake()
        {
            HTDW._mainMonoBehaviour = this;
            HTDW._mainGameObject = base.gameObject;
            HTDW._mainCamera = base.camera;
            base.useGUILayout = false;
        }
        // 当引擎所有准备工作做好了，准备运行第一帧时调用
        void Start()
        {
            HTDW._lockInitList = true;
            foreach (I_Init i in HTDW._initList)
            {
                i.Init();
            }
            HTDW._lockInitList = false;
        }
        // 每一帧调用一次
        void Update()
        {
            foreach (I_Update i in HTDW._updateList)
            {
                i.Update();
            }
        }
        // 每一帧调用一次,在所有Update()调用完之后紧接着调用
        void LateUpdate()
        {
            foreach (I_LateUpdate i in HTDW._lateUpdateList)
            {
                i.LateUpdate();
            }
        }
        // 每个物理时间步调用，跟帧率不同的时间轴(但是同一个线程)，这个时间步在Edit->Project Settings->Time->Fixed Timestep可以设置
        void FixedUpdate()
        {
            foreach (I_FixedUpdate i in HTDW._fixedUpdateList)
            {
                i.FixedUpdate();
            }
        }
        // 每帧调用多次，渲染和处理GUI事件时调用
        void OnGUI()
        {
            switch (Event.current.type)
            {
                case EventType.Repaint:     //重绘事件
                    foreach (I_Draw i in HTDW._drawList)
                    {
                        i.Draw();
                    }
                    break;
                case EventType.Layout:      //布局事件( GUI.Window() 和 GUILayout.xxx() 在这个事件里绘制 )
                    Debug.Log("布局事件" + Time.frameCount);
                    break;
                case EventType.KeyDown:     //按键按下
                    Debug.Log("按键按下" + Time.frameCount);
                    break;
                case EventType.KeyUp:       //按键放开
                    Debug.Log("按键放开" + Time.frameCount);
                    break;
                case EventType.MouseDown:   //鼠标按钮按下
                    Debug.Log("鼠标按下" + Time.frameCount);
                    break;
                case EventType.MouseUp:     //鼠标按钮放开
                    Debug.Log("鼠标放开" + Time.frameCount);
                    break;
                case EventType.MouseMove:   //鼠标移动
                    Debug.Log("鼠标移动" + Time.frameCount);
                    break;
                case EventType.MouseDrag:   //鼠标拖动(鼠标按钮按下并移动)
                    Debug.Log("鼠标拖动" + Time.frameCount);
                    break;
                case EventType.ScrollWheel: //鼠标滚轮滚动
                    Debug.Log("鼠标滚轮滚动" + Time.frameCount);
                    break;
                case EventType.Ignore:      //事件应被忽略
                    Debug.Log("事件应被忽略" + Time.frameCount);
                    break;
                case EventType.Used:        //已经处理过的事件
                    Debug.Log("已经处理过的事件" + Time.frameCount);
                    break;
                default:
                    Debug.Log("其他事件" + Time.frameCount);
                    break;
            }
        }
        // 当MonoBehaviour变为可用或激活状态时此函数被调用
        void OnEnable()
        {
            //Debug.Log("OnEnable" + Time.frameCount);
        }
        // 当MonoBehaviour变为不可用或非激活状态时此函数被调用
        void OnDisable()
        {
            //Debug.Log("OnDisable" + Time.frameCount);
        }
        // 当MonoBehaviour将被销毁时，这个函数被调用
        void OnDestroy()
        {
            //Debug.Log("OnDestroy" + Time.frameCount);
        }
        // 当游戏暂停或继续时调用
        void OnApplicationPause(bool pause)
        {
            //Debug.Log("OnApplicationPause" + Time.frameCount);
        }
        //  当游戏失去焦点或得到焦点时调用
        void OnApplicationFocus(bool focus)
        {
            //Debug.Log("OnApplicationFocus" + Time.frameCount);
        }
        // 当游戏退出时调用
        void OnApplicationQuit()
        {
            //Debug.Log("OnApplicationQuit" + Time.frameCount);
        }
        // 当一个新关卡被载入时此函数被调用
        void OnLevelWasLoaded(int level)
        {
            //Debug.Log("OnLevelWasLoaded" + Time.frameCount);
        }
        // ======================================== 相机触发 ========================================
        // 当renderer(渲染器)在任何相机上可见时调用
        void OnBecameVisible()
        {
            //Debug.Log("OnBecameVisible" + Time.frameCount);
        }
        // 当renderer(渲染器)在任何相机上都不可见时调用
        void OnBecameInvisible()
        {
            //Debug.Log("OnBecameInvisible" + Time.frameCount);
        }
        // 在相机剔除场景之前被调用
        void OnPreCull()
        {
            //Debug.Log("OnPreCull" + Time.frameCount);
        }
        // 如果对象可见每个相机在渲染之前都会调用它
        void OnWillRenderObject()
        {
            //Debug.Log("OnWillRenderObject" + Time.frameCount);
        }
        // 在相机渲染场景之前被调用
        void OnPreRender()
        {
            //Debug.Log("OnPreRender" + Time.frameCount);
        }
        // 在相机渲染场景之后被调用
        void OnPostRender()
        {
            //Debug.Log("OnPostRender" + Time.frameCount);
        }
        // 在每个相机场景渲染完成后都会调用它
        void OnRenderObject()
        {
            //Debug.Log("OnRenderObject" + Time.frameCount);
        }
        // 在相机完成所有渲染之后调用
        void OnRenderImage(RenderTexture source, RenderTexture destination)
        {
            //Debug.Log("OnRenderImage" + Time.frameCount);
            Graphics.Blit(source, destination);
        }
        // ======================================== 碰撞触发 ========================================
        // 当鼠标进入到GUIElement(GUI元素)或Collider(碰撞体)中时调用
        void OnMouseEnter()
        {
            Debug.Log("OnMouseEnter" + Time.frameCount);
        }
        // 当鼠标悬浮在GUIElement(GUI元素)或Collider(碰撞体)上时调用
        void OnMouseOver()
        {
            Debug.Log("OnMouseOver" + Time.frameCount);
        }
        // 当鼠标移出GUIElement(GUI元素)或Collider(碰撞体)上时调用
        void OnMouseExit()
        {
            Debug.Log("OnMouseExit" + Time.frameCount);
        }
        // 当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上点击时调用
        void OnMouseDown()
        {
            Debug.Log("OnMouseDown" + Time.frameCount);
        }
        // 当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上释放时调用
        void OnMouseUp()
        {
            Debug.Log("OnMouseUp" + Time.frameCount);
        }
        // 只有当鼠标在同一个GUIElement或Collider按下，在释放时调用
        void OnMouseUpAsButton()
        {
            Debug.Log("OnMouseUpAsButton" + Time.frameCount);
        }
        // 当用户鼠标拖拽GUIElement(GUI元素)或Collider(碰撞体)时调用
        void OnMouseDrag()
        {
            Debug.Log("OnMouseDrag" + Time.frameCount);
        }
        // 当Collider(碰撞体)进入trigger(触发器)时调用
        void OnTriggerEnter(Collider other)
        {
            Debug.Log("OnTriggerEnter" + Time.frameCount);
        }
        // 当Collider(碰撞体)停止触发trigger(触发器)时调用
        void OnTriggerExit(Collider other)
        {
            Debug.Log("OnTriggerExit" + Time.frameCount);
        }
        // 当碰撞体接触触发器时，在每一帧被调用
        void OnTriggerStay(Collider other)
        {
            Debug.Log("OnTriggerStay" + Time.frameCount);
        }
        // 当此collider/rigidbody触发另一个rigidbody/collider时调用
        void OnCollisionEnter(Collision collision)
        {
            Debug.Log("OnCollisionEnter" + Time.frameCount);
        }
        // 当此collider/rigidbody停止触发另一个rigidbody/collider时调用
        void OnCollisionExit(Collision collision)
        {
            Debug.Log("OnCollisionExit" + Time.frameCount);
        }
        // 当此collider/rigidbody触发另一个rigidbody/collider时在每一帧被调用
        void OnCollisionStay(Collision collision)
        {
            Debug.Log("OnCollisionStay" + Time.frameCount);
        }
        // 在移动的时，当controller碰撞到collider时调用
        void OnControllerColliderHit(ControllerColliderHit hit)
        {
            Debug.Log("OnControllerColliderHit" + Time.frameCount);
        }
        // 当附在同一对象上的关节被断开时调用
        void OnJointBreak(float breakForce)
        {
            Debug.Log("OnJointBreak" + Time.frameCount);
        }
        // 当粒子碰到collider时被调用
        void OnParticleCollision(GameObject other)
        {
            Debug.Log("OnParticleCollision" + Time.frameCount);
        }
        // ======================================== 网络触发 ========================================
        // 当一个新玩家成功连接时在服务器上调用
        void OnPlayerConnected(NetworkPlayer player)
        {
            Debug.Log("OnPlayerConnected" + Time.frameCount);
        }
        // 当Network.InitializeServer被调用并完成时，在服务器上调用这个函数
        void OnServerInitialized()
        {
            Debug.Log("OnServerInitialized" + Time.frameCount);
        }
        // 当客户端成功连接到服务器时，在客户端调用这个函数
        void OnConnectedToServer()
        {
            Debug.Log("OnConnectedToServer" + Time.frameCount);
        }
        // 当一个玩家从服务器上断开时在服务器端调用
        void OnPlayerDisconnected(NetworkPlayer player)
        {
            Debug.Log("OnPlayerDisconnected" + Time.frameCount);
        }
        // 当失去连接或从服务器端断开时在客户端调用
        void OnDisconnectedFromServer(NetworkDisconnection info)
        {
            Debug.Log("OnDisconnectedFromServer" + Time.frameCount);
        }
        // 当一个连接因为某些原因失败时在客户端调用
        void OnFailedToConnect(NetworkConnectionError error)
        {
            Debug.Log("OnFailedToConnect" + Time.frameCount);
        }
        // 当连接主服务器出现问题时在客户端或服务器端调用
        void OnFailedToConnectToMasterServer(NetworkConnectionError info)
        {
            Debug.Log("OnFailedToConnectToMasterServer" + Time.frameCount);
        }
        // 当报告事件来自主服务器时在客户端或服务器端调用
        void OnMasterServerEvent(MasterServerEvent msEvent)
        {
            Debug.Log("OnMasterServerEvent" + Time.frameCount);
        }
        // 当一个物体使用Network.Instantiate进行网络初始化时调用
        void OnNetworkInstantiate(NetworkMessageInfo info)
        {
            Debug.Log("OnNetworkInstantiate" + Time.frameCount);
        }
        // 在一个网络视图脚本中，用于自定义变量同步
        void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
        {
            Debug.Log("OnSerializeNetworkView" + Time.frameCount);
        }
        // ======================================== 其他触发 ========================================
        void OnAudioFilterRead(float[] data, int channels)
        {
            //Debug.Log("OnAudioFilterRead" + Time.frameCount);
        }
        // ======================================== 编辑器触发 ========================================
        // 在物体被选中时绘制Gizmos
        void OnDrawGizmosSelected()
        {
            //Debug.Log("OnDrawGizmosSelected" + Time.frameCount);
        }
        // 绘制可被点选的Gizmos
        void OnDrawGizmos()
        {
            //Debug.Log("OnDrawGizmos" + Time.frameCount);
        }
        // 在用户点击检视面板的Reset按钮或者首次添加该组件时被调用
        void Reset()
        {
            //Debug.Log("Reset" + Time.frameCount);
        }
    }
}
